package it.azienda.framework.controllo;

import it.azienda.framework.utilita.Utilita;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import it.azienda.moretti.modello.BeanUtente;
import it.azienda.framework.persistenza.DAOConnectionSingleton;
import it.azienda.framework.persistenza.DAOException;
import it.azienda.moretti.modello.BeanAppPrenotazione;
import it.azienda.moretti.modello.BeanPrenotazione;
import it.azienda.moretti.utilita.EncodeMd5;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.hibernate.Query;
import org.hibernate.Session;

public class AzioneLogin implements Serializable {

    public String esegui() {
        String forward = "";
        FacesContext ctx = FacesContext.getCurrentInstance();
        BeanUtente login = (BeanUtente) ctx.getApplication().getVariableResolver().resolveVariable(ctx, "login");
        BeanUtente utenteCaricato = caricaUtente(login.getEmail());

        if (utenteCaricato == null) {
            ctx.addMessage(null, new FacesMessage("Utente Non Registrato"));
            forward = "erroreLogin";
        } else {
            login.verificaPassword(EncodeMd5.encodeMd5(login.getPassword()), utenteCaricato.getPassword());
            if (!login.isAutenticato()) {
                ctx.addMessage(null, new FacesMessage("Password Errata"));
                forward = "erroreLogin";
            } else {
                login = utenteCaricato;
                Utilita.getSession().setAttribute("login", login);
                BeanAppPrenotazione appPrenotazione = (BeanAppPrenotazione) Utilita.getSession().getAttribute("beanAppPrenotazione");
                if (appPrenotazione != null) {
                    forward = "confermaPrenotazione";
                    BeanPrenotazione beanPrenotazione = new BeanPrenotazione(appPrenotazione, login);
                    if (beanPrenotazione.getNumero() == null) {
                        String query = " select max(regione.numero) from BeanPrenotazione regione";
                        Session session = null;
                        try {
                            session = DAOConnectionSingleton.newSession();
                            Query q = null;
                            q = session.createQuery(query);
                            ArrayList listaCodice = (ArrayList) q.list();
                            Integer cod = (Integer) listaCodice.get(0);
                            if (cod != null) {
                                beanPrenotazione.setNumero(new Integer(cod.intValue() + 1));
                            } else {
                                beanPrenotazione.setNumero(new Integer(1));
                            }
                        } catch (Exception e) {
                        }
                    }

                    Utilita.getRequest().setAttribute("beanPrenotazione", beanPrenotazione);
                    Utilita.getSession().setAttribute("prenotazione", beanPrenotazione);

                } else {
                    forward = "successo";
                }
            }
        }
        return forward;
    }

    public BeanUtente caricaUtente(String nomeUtente) {
        Session sessione = DAOConnectionSingleton.newSession();

        BeanUtente login = null;
        try {

            DAOConnectionSingleton.beginTransaction();
            List risultato = (ArrayList) sessione.getNamedQuery("caricaUtente").setString("nomeUtente", nomeUtente).list();
            DAOConnectionSingleton.commitTransaction();
            if (risultato.size() != 0) {
                login = (BeanUtente) risultato.get(0);
            }
        } catch (DAOException ex) {
            ex.printStackTrace();
            System.out.println("errore" + ex.getCause());
            try {
                DAOConnectionSingleton.rollbackTransaction();

            } catch (DAOException exc) {
            }
        } finally {
            DAOConnectionSingleton.closeSession();
        }
        return login;
    }
}
